陈某某的网络日志

活到老学到老,学习无止境

0%

Linux的sort总结

简介

linux下的排序操作离不开sort,总结一下易用错的地方。

主要选项

1
2
3
4
5
6
7
8
9
10
11
12
-b:寻找排序的keys时忽略前导的空白字符(blank)
-c:检查文件是否已经按照顺序排序,如未排序,会提示从哪一行开始乱序
-d:只处理英文字母、数字及空格,忽略其他的字符
-h:使用易读性数字(例如:2K、1G)
-i:除了040至176之间的ASCII字符外(八进制0-177),忽略其他的字符(忽略无法打印的字符如退格/换页键/回车)
-k:指定要用来排序的位置
-m:将几个排序好的文件进行合并,只是单纯合并,不做排序
-M:将前面3个字母依照月份的缩写进行排序
-n:依照数值的大小排序
-r:降序
-u:忽略相同行
-t<分隔字符>:指定分隔符,默认的分隔符为空白字符和非空白字符之间的空字符

常用且易错的用法

分隔符

和其它常见的linux工具不同的是,默认的分隔符是 非空白字符(non-blank charactor)和空白字符(blank charactor) 和之间的空字符串(empty string “”)(一定是前面是非空白,后面是空白之间的)
如:" foo bar" 默认分成两段 " foo"" bar",注意前面有空格。
明确这点很重要,会引出-b的使用。

-b选项

sort如不指定-k,默认的keys就是整行。-b可以忽略key前导的空白字符(默认就是空格和Tab) 。

-k选项

-k pos1[,pos2]
指定要排序的keys的位置,如果结束位置忽略,就一直到整行的结尾,所以不建议随意省略结束位置
开始和结束位置都是这样的格式:f[.c][opts]
f是区段号,从1开始
.c是区段开始的第几个字符,从1开始
如果.c在开始区段时省略,则从第1个字符开始;如果.c在结束区段时省略,相当于默认设置的0,一直到区段的结尾。
opts 是选项 MbdfghinRrV ,每个key都可以有不同的选项,会覆盖全局的选项(只要为key指定一个选项,全局的选项对该key就会失效)
除了-b选项,其它选项写在开始位置 或 结束位置 是等价的。
如: -k 2n,2 or -k 2n,2n 和-k 2,2n 是等价的。
可以指定多个-k ,先按最前的-k排序,再按后面的-k排序。

-n 选项

只识别 -(负号),数字,千位分隔符,小数点。 不识别+号,指数符e,字母
如果-n 跨区段比较(肯定有区段间的分隔符),或碰到不识别的会立即停止往后寻找key。

–debug

可以直观看到排序的keys

-s 选项

sort默认有 最后排序(last-resort comparison),按整行的ascii顺序排序,可能会使结果不稳定。
加-s 选项会阻止最后排序,使结果稳定。
-u选项也会阻止最后排序

参考

GNU sort